<!DOCTYPE html>
<html lang="en-us">
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
<meta charset="UTF-8">
<title>Moving Average Aggregation | Elasticsearch Guide [7.7] | Elastic</title>
<link rel="home" href="index.html" title="Elasticsearch Guide [7.7]">
<link rel="up" href="search-aggregations-pipeline.html" title="Pipeline Aggregations">
<link rel="prev" href="search-aggregations-pipeline-percentiles-bucket-aggregation.html" title="Percentiles Bucket Aggregation">
<link rel="next" href="search-aggregations-pipeline-movfn-aggregation.html" title="Moving Function Aggregation">
<meta name="DC.type" content="Learn/Docs/Elasticsearch/Reference/7.7">
<meta name="DC.subject" content="Elasticsearch">
<meta name="DC.identifier" content="7.7">
<meta name="robots" content="noindex,nofollow">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.optimizely.com/js/18132920325.js"></script>
    <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
    <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
    <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
    <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
    <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
    <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
    <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
    <link rel="manifest" href="/manifest.json">
    <meta name="apple-mobile-web-app-title" content="Elastic">
    <meta name="application-name" content="Elastic">
    <meta name="msapplication-TileColor" content="#ffffff">
    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
    <meta name="theme-color" content="#ffffff">
    <meta name="naver-site-verification" content="936882c1853b701b3cef3721758d80535413dbfd">
    <meta name="yandex-verification" content="d8a47e95d0972434">
    <meta name="localized" content="true">
    <meta name="st:robots" content="follow,index">
    <meta property="og:image" content="https://www.elastic.co/static/images/elastic-logo-200.png">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
    <link rel="apple-touch-icon-precomposed" sizes="64x64" href="/favicon_64x64_16bit.png">
    <link rel="apple-touch-icon-precomposed" sizes="32x32" href="/favicon_32x32.png">
    <link rel="apple-touch-icon-precomposed" sizes="16x16" href="/favicon_16x16.png">
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href="/guide/static/styles.css">
  </head>

  <!--© 2015-2021 Elasticsearch B.V. Copying, publishing and/or distributing without written permission is strictly prohibited.-->

  <body>
    <!-- Google Tag Manager -->
    <script>dataLayer = [];</script><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-58RLH5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-58RLH5');</script>
    <!-- End Google Tag Manager -->

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-12395217-16"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-12395217-16');
    </script>

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    <script type="text/javascript">
      (function(){var g=function(e,h,f,g){
      this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
      this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
      this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
      this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
      this.start=function(){var a=this;window.addEventListener?window.addEventListener("load",function(){a.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){a.go()})}};
      try{(new g(100,"r","QSI_S_ZN_emkP0oSe9Qrn7kF","https://znemkp0ose9qrn7kf-elastic.siteintercept.qualtrics.com/WRSiteInterceptEngine/?Q_ZID=ZN_emkP0oSe9Qrn7kF")).start()}catch(i){}})();
    </script><div id="ZN_emkP0oSe9Qrn7kF"><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    <!--END WEBSITE FEEDBACK SNIPPET-->

    <div id="elastic-nav" style="display:none;"></div>
    <script src="https://www.elastic.co/elastic-nav.js"></script>

    <!-- Subnav -->
    <div>
      <div>
        <div class="tertiary-nav d-none d-md-block">
          <div class="container">
            <div class="p-t-b-15 d-flex justify-content-between nav-container">
              <div class="breadcrum-wrapper"><span><a href="/guide/" style="font-size: 14px; font-weight: 600; color: #000;">Docs</a></span></div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <div class="main-container">
      <section id="content">
        <div class="content-wrapper">

          <section id="guide" lang="en">
            <div class="container">
              <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                  <!-- start body -->
                  <div class="page_header">
<strong>IMPORTANT</strong>: No additional bug fixes or documentation updates
will be released for this version. For the latest information, see the
<a href="../current/index.html">current release documentation</a>.
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch Guide [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="search-aggregations.html">Aggregations</a></span>
»
<span class="breadcrumb-link"><a href="search-aggregations-pipeline.html">Pipeline Aggregations</a></span>
»
<span class="breadcrumb-node">Moving Average Aggregation</span>
</div>
<div class="navheader">
<span class="prev">
<a href="search-aggregations-pipeline-percentiles-bucket-aggregation.html">« Percentiles Bucket Aggregation</a>
</span>
<span class="next">
<a href="search-aggregations-pipeline-movfn-aggregation.html">Moving Function Aggregation »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="search-aggregations-pipeline-movavg-aggregation"></a>Moving Average Aggregation<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/aggregations/pipeline/movavg-aggregation.asciidoc">edit</a>
</h2>
</div></div></div>
<p><span class="Admonishment Admonishment--change">
[<span class="Admonishment-version u-mono u-strikethrough">6.4.0</span>]
<span class="Admonishment-detail">
Deprecated in 6.4.0. The Moving Average aggregation has been deprecated in favor of the more general <a class="xref" href="search-aggregations-pipeline-movfn-aggregation.html" title="Moving Function Aggregation">Moving Function Aggregation</a>.  The new Moving Function aggregation provides all the same functionality as the Moving Average aggregation, but also provides more flexibility.
</span>
</span></p>
<p>Given an ordered series of data, the Moving Average aggregation will slide a window across the data and emit the average
value of that window.  For example, given the data <code class="literal">[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]</code>, we can calculate a simple moving
average with windows size of <code class="literal">5</code> as follows:</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
(1 + 2 + 3 + 4 + 5) / 5  = 3
</li>
<li class="listitem">
(2 + 3 + 4 + 5 + 6) / 5  = 4
</li>
<li class="listitem">
(3 + 4 + 5 + 6 + 7) / 5 = 5
</li>
<li class="listitem">
etc
</li>
</ul>
</div>
<p>Moving averages are a simple method to smooth sequential data.  Moving averages are typically applied to time-based data,
such as stock prices or server metrics.  The smoothing can be used to eliminate high frequency fluctuations or random noise,
which allows the lower frequency trends to be more easily visualized, such as seasonality.</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_syntax_12"></a>Syntax<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/aggregations/pipeline/movavg-aggregation.asciidoc">edit</a>
</h3>
</div></div></div>
<p>A <code class="literal">moving_avg</code> aggregation looks like this in isolation:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
    "moving_avg": {
        "buckets_path": "the_sum",
        "model": "holt",
        "window": 5,
        "gap_policy": "insert_zeros",
        "settings": {
            "alpha": 0.8
        }
    }
}</pre>
</div>
<div class="table">
<p class="title"><strong>Table 18. <code class="literal">moving_avg</code> Parameters</strong></p>
<div class="table-contents">
<table border="1" cellpadding="4px" summary="moving_avg Parameters">
<colgroup>
<col class="col_1">
<col class="col_2">
<col class="col_3">
<col class="col_4">
</colgroup>
<tbody>
<tr>
<td align="left" valign="top"><p>Parameter Name</p></td>
<td align="left" valign="top"><p>Description</p></td>
<td align="left" valign="top"><p>Required</p></td>
<td align="left" valign="top"><p>Default Value</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">buckets_path</code></p></td>
<td align="left" valign="top"><p>Path to the metric of interest (see <a class="xref" href="search-aggregations-pipeline.html#buckets-path-syntax" title="buckets_path Syntax"><code class="literal">buckets_path</code> Syntax</a> for more details</p></td>
<td align="left" valign="top"><p>Required</p></td>
<td align="left" valign="top"><p></p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">model</code></p></td>
<td align="left" valign="top"><p>The moving average weighting model that we wish to use</p></td>
<td align="left" valign="top"><p>Optional</p></td>
<td align="left" valign="top"><p><code class="literal">simple</code></p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">gap_policy</code></p></td>
<td align="left" valign="top"><p>Determines what should happen when a gap in the data is encountered.</p></td>
<td align="left" valign="top"><p>Optional</p></td>
<td align="left" valign="top"><p><code class="literal">insert_zeros</code></p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">window</code></p></td>
<td align="left" valign="top"><p>The size of window to "slide" across the histogram.</p></td>
<td align="left" valign="top"><p>Optional</p></td>
<td align="left" valign="top"><p><code class="literal">5</code></p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">minimize</code></p></td>
<td align="left" valign="top"><p>If the model should be algorithmically minimized.  See <a class="xref" href="search-aggregations-pipeline-movavg-aggregation.html#movavg-minimizer" title="Minimization">Minimization</a> for more
 details</p></td>
<td align="left" valign="top"><p>Optional</p></td>
<td align="left" valign="top"><p><code class="literal">false</code> for most models</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">settings</code></p></td>
<td align="left" valign="top"><p>Model-specific settings, contents which differ depending on the model specified.</p></td>
<td align="left" valign="top"><p>Optional</p></td>
<td align="left" valign="top"><p></p></td>
</tr>
</tbody>
</table>
</div>
</div>
<p><code class="literal">moving_avg</code> aggregations must be embedded inside of a <code class="literal">histogram</code> or <code class="literal">date_histogram</code> aggregation.  They can be
embedded like any other metric aggregation:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{                <a id="CO272-1"></a><i class="conum" data-value="1"></i>
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" } <a id="CO272-2"></a><i class="conum" data-value="2"></i>
                },
                "the_movavg":{
                    "moving_avg":{ "buckets_path": "the_sum" } <a id="CO272-3"></a><i class="conum" data-value="3"></i>
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/564.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO272-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>A <code class="literal">date_histogram</code> named "my_date_histo" is constructed on the "timestamp" field, with one-day intervals</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO272-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>A <code class="literal">sum</code> metric is used to calculate the sum of a field.  This could be any metric (sum, min, max, etc)</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO272-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>Finally, we specify a <code class="literal">moving_avg</code> aggregation which uses "the_sum" metric as its input.</p>
</td>
</tr>
</table>
</div>
<p>Moving averages are built by first specifying a <code class="literal">histogram</code> or <code class="literal">date_histogram</code> over a field.  You can then optionally
add normal metrics, such as a <code class="literal">sum</code>, inside of that histogram.  Finally, the <code class="literal">moving_avg</code> is embedded inside the histogram.
The <code class="literal">buckets_path</code> parameter is then used to "point" at one of the sibling metrics inside of the histogram (see
<a class="xref" href="search-aggregations-pipeline.html#buckets-path-syntax" title="buckets_path Syntax"><code class="literal">buckets_path</code> Syntax</a> for a description of the syntax for <code class="literal">buckets_path</code>.</p>
<p>An example response from the above aggregation may look like:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "my_date_histo": {
         "buckets": [
             {
                 "key_as_string": "2015/01/01 00:00:00",
                 "key": 1420070400000,
                 "doc_count": 3,
                 "the_sum": {
                    "value": 550.0
                 }
             },
             {
                 "key_as_string": "2015/02/01 00:00:00",
                 "key": 1422748800000,
                 "doc_count": 2,
                 "the_sum": {
                    "value": 60.0
                 },
                 "the_movavg": {
                    "value": 550.0
                 }
             },
             {
                 "key_as_string": "2015/03/01 00:00:00",
                 "key": 1425168000000,
                 "doc_count": 2,
                 "the_sum": {
                    "value": 375.0
                 },
                 "the_movavg": {
                    "value": 305.0
                 }
             }
         ]
      }
   }
}</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_models"></a>Models<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/aggregations/pipeline/movavg-aggregation.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">moving_avg</code> aggregation includes four different moving average "models".  The main difference is how the values in the
window are weighted.  As data-points become "older" in the window, they may be weighted differently.  This will
affect the final average for that window.</p>
<p>Models are specified using the <code class="literal">model</code> parameter.  Some models may have optional configurations which are specified inside
the <code class="literal">settings</code> parameter.</p>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_simple"></a>Simple<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/aggregations/pipeline/movavg-aggregation.asciidoc">edit</a>
</h4>
</div></div></div>
<p>The <code class="literal">simple</code> model calculates the sum of all values in the window, then divides by the size of the window.  It is effectively
a simple arithmetic mean of the window.  The simple model does not perform any time-dependent weighting, which means
the values from a <code class="literal">simple</code> moving average tend to "lag" behind the real data.</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg":{
                    "moving_avg":{
                        "buckets_path": "the_sum",
                        "window" : 30,
                        "model" : "simple"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/565.console"></div>
<p>A <code class="literal">simple</code> model has no special settings to configure</p>
<p>The window size can change the behavior of the moving average.  For example, a small window (<code class="literal">"window": 10</code>) will closely
track the data and only smooth out small scale fluctuations:</p>
<div id="movavg_10window" class="imageblock">
<div class="content">
<img src="images/pipeline_movavg/movavg_10window.png" alt="movavg 10window">
</div>
<div class="title">Figure 3. Moving average with window of size 10</div>
</div>
<p>In contrast, a <code class="literal">simple</code> moving average with larger window (<code class="literal">"window": 100</code>) will smooth out all higher-frequency fluctuations,
leaving only low-frequency, long term trends.  It also tends to "lag" behind the actual data by a substantial amount:</p>
<div id="movavg_100window" class="imageblock">
<div class="content">
<img src="images/pipeline_movavg/movavg_100window.png" alt="movavg 100window">
</div>
<div class="title">Figure 4. Moving average with window of size 100</div>
</div>
</div>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_linear"></a>Linear<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/aggregations/pipeline/movavg-aggregation.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">linear</code> model assigns a linear weighting to points in the series, such that "older" datapoints (e.g. those at
the beginning of the window) contribute a linearly less amount to the total average.  The linear weighting helps reduce
the "lag" behind the data’s mean, since older points have less influence.</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_avg":{
                        "buckets_path": "the_sum",
                        "window" : 30,
                        "model" : "linear"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/566.console"></div>
<p>A <code class="literal">linear</code> model has no special settings to configure</p>
<p>Like the <code class="literal">simple</code> model, window size can change the behavior of the moving average.  For example, a small window (<code class="literal">"window": 10</code>)
will closely track the data and only smooth out small scale fluctuations:</p>
<div id="linear_10window" class="imageblock">
<div class="content">
<img src="images/pipeline_movavg/linear_10window.png" alt="linear 10window">
</div>
<div class="title">Figure 5. Linear moving average with window of size 10</div>
</div>
<p>In contrast, a <code class="literal">linear</code> moving average with larger window (<code class="literal">"window": 100</code>) will smooth out all higher-frequency fluctuations,
leaving only low-frequency, long term trends.  It also tends to "lag" behind the actual data by a substantial amount,
although typically less than the <code class="literal">simple</code> model:</p>
<div id="linear_100window" class="imageblock">
<div class="content">
<img src="images/pipeline_movavg/linear_100window.png" alt="linear 100window">
</div>
<div class="title">Figure 6. Linear moving average with window of size 100</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_ewma_exponentially_weighted"></a>EWMA (Exponentially Weighted)<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/aggregations/pipeline/movavg-aggregation.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">ewma</code> model (aka "single-exponential") is similar to the <code class="literal">linear</code> model, except older data-points become exponentially less important,
rather than linearly less important.  The speed at which the importance decays can be controlled with an <code class="literal">alpha</code>
setting.  Small values make the weight decay slowly, which provides greater smoothing and takes into account a larger
portion of the window.  Larger values make the weight decay quickly, which reduces the impact of older values on the
moving average.  This tends to make the moving average track the data more closely but with less smoothing.</p>
<p>The default value of <code class="literal">alpha</code> is <code class="literal">0.3</code>, and the setting accepts any float from 0-1 inclusive.</p>
<p>The EWMA model can be <a class="xref" href="search-aggregations-pipeline-movavg-aggregation.html#movavg-minimizer" title="Minimization">Minimized</a></p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_avg":{
                        "buckets_path": "the_sum",
                        "window" : 30,
                        "model" : "ewma",
                        "settings" : {
                            "alpha" : 0.5
                        }
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/567.console"></div>
<div id="single_0.2alpha" class="imageblock">
<div class="content">
<img src="images/pipeline_movavg/single_0.2alpha.png" alt="single 0.2alpha">
</div>
<div class="title">Figure 7. EWMA with window of size 10, alpha = 0.2</div>
</div>
<div id="single_0.7alpha" class="imageblock">
<div class="content">
<img src="images/pipeline_movavg/single_0.7alpha.png" alt="single 0.7alpha">
</div>
<div class="title">Figure 8. EWMA with window of size 10, alpha = 0.7</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_holt_linear"></a>Holt-Linear<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/aggregations/pipeline/movavg-aggregation.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">holt</code> model (aka "double exponential") incorporates a second exponential term which
tracks the data’s trend.  Single exponential does not perform well when the data has an underlying linear trend.  The
double exponential model calculates two values internally: a "level" and a "trend".</p>
<p>The level calculation is similar to <code class="literal">ewma</code>, and is an exponentially weighted view of the data.  The difference is
that the previously smoothed value is used instead of the raw value, which allows it to stay close to the original series.
The trend calculation looks at the difference between the current and last value (e.g. the slope, or trend, of the
smoothed data).  The trend value is also exponentially weighted.</p>
<p>Values are produced by multiplying the level and trend components.</p>
<p>The default value of <code class="literal">alpha</code> is <code class="literal">0.3</code> and <code class="literal">beta</code> is <code class="literal">0.1</code>. The settings accept any float from 0-1 inclusive.</p>
<p>The Holt-Linear model can be <a class="xref" href="search-aggregations-pipeline-movavg-aggregation.html#movavg-minimizer" title="Minimization">Minimized</a></p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_avg":{
                        "buckets_path": "the_sum",
                        "window" : 30,
                        "model" : "holt",
                        "settings" : {
                            "alpha" : 0.5,
                            "beta" : 0.5
                        }
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/568.console"></div>
<p>In practice, the <code class="literal">alpha</code> value behaves very similarly in <code class="literal">holt</code> as <code class="literal">ewma</code>: small values produce more smoothing
and more lag, while larger values produce closer tracking and less lag.  The value of <code class="literal">beta</code> is often difficult
to see.  Small values emphasize long-term trends (such as a constant linear trend in the whole series), while larger
values emphasize short-term trends.  This will become more apparently when you are predicting values.</p>
<div id="double_0.2beta" class="imageblock">
<div class="content">
<img src="images/pipeline_movavg/double_0.2beta.png" alt="double 0.2beta">
</div>
<div class="title">Figure 9. Holt-Linear moving average with window of size 100, alpha = 0.5, beta = 0.2</div>
</div>
<div id="double_0.7beta" class="imageblock">
<div class="content">
<img src="images/pipeline_movavg/double_0.7beta.png" alt="double 0.7beta">
</div>
<div class="title">Figure 10. Holt-Linear moving average with window of size 100, alpha = 0.5, beta = 0.7</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_holt_winters"></a>Holt-Winters<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/aggregations/pipeline/movavg-aggregation.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">holt_winters</code> model (aka "triple exponential") incorporates a third exponential term which
tracks the seasonal aspect of your data.  This aggregation therefore smooths based on three components: "level", "trend"
and "seasonality".</p>
<p>The level and trend calculation is identical to <code class="literal">holt</code> The seasonal calculation looks at the difference between
the current point, and the point one period earlier.</p>
<p>Holt-Winters requires a little more handholding than the other moving averages.  You need to specify the "periodicity"
of your data: e.g. if your data has cyclic trends every 7 days, you would set <code class="literal">period: 7</code>.  Similarly if there was
a monthly trend, you would set it to <code class="literal">30</code>.  There is currently no periodicity detection, although that is planned
for future enhancements.</p>
<p>There are two varieties of Holt-Winters: additive and multiplicative.</p>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_cold_start"></a>"Cold Start"<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/aggregations/pipeline/movavg-aggregation.asciidoc">edit</a>
</h4>
</div></div></div>
<p>Unfortunately, due to the nature of Holt-Winters, it requires two periods of data to "bootstrap" the algorithm.  This
means that your <code class="literal">window</code> must always be <span class="strong strong"><strong>at least</strong></span> twice the size of your period.  An exception will be thrown if it
isn’t.  It also means that Holt-Winters will not emit a value for the first <code class="literal">2 * period</code> buckets; the current algorithm
does not backcast.</p>
<div id="holt_winters_cold_start" class="imageblock">
<div class="content">
<img src="images/pipeline_movavg/triple_untruncated.png" alt="triple untruncated">
</div>
<div class="title">Figure 11. Holt-Winters showing a "cold" start where no values are emitted</div>
</div>
<p>Because the "cold start" obscures what the moving average looks like, the rest of the Holt-Winters images are truncated
to not show the "cold start".  Just be aware this will always be present at the beginning of your moving averages!</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_additive_holt_winters"></a>Additive Holt-Winters<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/aggregations/pipeline/movavg-aggregation.asciidoc">edit</a>
</h4>
</div></div></div>
<p>Additive seasonality is the default; it can also be specified by setting <code class="literal">"type": "add"</code>.  This variety is preferred
when the seasonal affect is additive to your data. E.g. you could simply subtract the seasonal effect to "de-seasonalize"
your data into a flat trend.</p>
<p>The default values of <code class="literal">alpha</code> and <code class="literal">gamma</code> are <code class="literal">0.3</code> while <code class="literal">beta</code> is <code class="literal">0.1</code>.  The settings accept any float from 0-1 inclusive.
The default value of <code class="literal">period</code> is <code class="literal">1</code>.</p>
<p>The additive Holt-Winters model can be <a class="xref" href="search-aggregations-pipeline-movavg-aggregation.html#movavg-minimizer" title="Minimization">Minimized</a></p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_avg":{
                        "buckets_path": "the_sum",
                        "window" : 30,
                        "model" : "holt_winters",
                        "settings" : {
                            "type" : "add",
                            "alpha" : 0.5,
                            "beta" : 0.5,
                            "gamma" : 0.5,
                            "period" : 7
                        }
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/569.console"></div>
<div id="holt_winters_add" class="imageblock">
<div class="content">
<img src="images/pipeline_movavg/triple.png" alt="triple">
</div>
<div class="title">Figure 12. Holt-Winters moving average with window of size 120, alpha = 0.5, beta = 0.7, gamma = 0.3, period = 30</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_multiplicative_holt_winters"></a>Multiplicative Holt-Winters<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/aggregations/pipeline/movavg-aggregation.asciidoc">edit</a>
</h4>
</div></div></div>
<p>Multiplicative is specified by setting <code class="literal">"type": "mult"</code>.  This variety is preferred when the seasonal affect is
multiplied against your data. E.g. if the seasonal affect is x5 the data, rather than simply adding to it.</p>
<p>The default values of <code class="literal">alpha</code> and <code class="literal">gamma</code> are <code class="literal">0.3</code> while <code class="literal">beta</code> is <code class="literal">0.1</code>.  The settings accept any float from 0-1 inclusive.
The default value of <code class="literal">period</code> is <code class="literal">1</code>.</p>
<p>The multiplicative Holt-Winters model can be <a class="xref" href="search-aggregations-pipeline-movavg-aggregation.html#movavg-minimizer" title="Minimization">Minimized</a></p>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>Multiplicative Holt-Winters works by dividing each data point by the seasonal value.  This is problematic if any of
your data is zero, or if there are gaps in the data (since this results in a divid-by-zero).  To combat this, the
<code class="literal">mult</code> Holt-Winters pads all values by a very small amount (1*10<sup>-10</sup>) so that all values are non-zero.  This affects
the result, but only minimally.  If your data is non-zero, or you prefer to see <code class="literal">NaN</code> when zero’s are encountered,
you can disable this behavior with <code class="literal">pad: false</code></p>
</div>
</div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_avg":{
                        "buckets_path": "the_sum",
                        "window" : 30,
                        "model" : "holt_winters",
                        "settings" : {
                            "type" : "mult",
                            "alpha" : 0.5,
                            "beta" : 0.5,
                            "gamma" : 0.5,
                            "period" : 7,
                            "pad" : true
                        }
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/570.console"></div>
</div>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_prediction"></a>Prediction<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/aggregations/pipeline/movavg-aggregation.asciidoc">edit</a>
</h3>
</div></div></div>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>This functionality is experimental and may be changed or removed completely in a future release. Elastic will take a best effort approach to fix any issues, but experimental features are not subject to the support SLA of official GA features.</p>
</div>
</div>
<p>All the moving average model support a "prediction" mode, which will attempt to extrapolate into the future given the
current smoothed, moving average.  Depending on the model and parameter, these predictions may or may not be accurate.</p>
<p>Predictions are enabled by adding a <code class="literal">predict</code> parameter to any moving average aggregation, specifying the number of
predictions you would like appended to the end of the series.  These predictions will be spaced out at the same interval
as your buckets:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_avg":{
                        "buckets_path": "the_sum",
                        "window" : 30,
                        "model" : "simple",
                        "predict" : 10
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/571.console"></div>
<p>The <code class="literal">simple</code>, <code class="literal">linear</code> and <code class="literal">ewma</code> models all produce "flat" predictions: they essentially converge on the mean
of the last value in the series, producing a flat:</p>
<div id="simple_prediction" class="imageblock">
<div class="content">
<img src="images/pipeline_movavg/simple_prediction.png" alt="simple prediction">
</div>
<div class="title">Figure 13. Simple moving average with window of size 10, predict = 50</div>
</div>
<p>In contrast, the <code class="literal">holt</code> model can extrapolate based on local or global constant trends.  If we set a high <code class="literal">beta</code>
value, we can extrapolate based on local constant trends (in this case the predictions head down, because the data at the end
of the series was heading in a downward direction):</p>
<div id="double_prediction_local" class="imageblock">
<div class="content">
<img src="images/pipeline_movavg/double_prediction_local.png" alt="double prediction local">
</div>
<div class="title">Figure 14. Holt-Linear moving average with window of size 100, predict = 20, alpha = 0.5, beta = 0.8</div>
</div>
<p>In contrast, if we choose a small <code class="literal">beta</code>, the predictions are based on the global constant trend.  In this series, the
global trend is slightly positive, so the prediction makes a sharp u-turn and begins a positive slope:</p>
<div id="double_prediction_global" class="imageblock">
<div class="content">
<img src="images/pipeline_movavg/double_prediction_global.png" alt="double prediction global">
</div>
<div class="title">Figure 15. Double Exponential moving average with window of size 100, predict = 20, alpha = 0.5, beta = 0.1</div>
</div>
<p>The <code class="literal">holt_winters</code> model has the potential to deliver the best predictions, since it also incorporates seasonal
fluctuations into the model:</p>
<div id="holt_winters_prediction_global" class="imageblock">
<div class="content">
<img src="images/pipeline_movavg/triple_prediction.png" alt="triple prediction">
</div>
<div class="title">Figure 16. Holt-Winters moving average with window of size 120, predict = 25, alpha = 0.8, beta = 0.2, gamma = 0.7, period = 30</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="movavg-minimizer"></a>Minimization<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/aggregations/pipeline/movavg-aggregation.asciidoc">edit</a>
</h3>
</div></div></div>
<p>Some of the models (EWMA, Holt-Linear, Holt-Winters) require one or more parameters to be configured.  Parameter choice
can be tricky and sometimes non-intuitive.  Furthermore, small deviations in these parameters can sometimes have a drastic
effect on the output moving average.</p>
<p>For that reason, the three "tunable" models can be algorithmically <span class="strong strong"><strong>minimized</strong></span>.  Minimization is a process where parameters
are tweaked until the predictions generated by the model closely match the output data.  Minimization is not fullproof
and can be susceptible to overfitting, but it often gives better results than hand-tuning.</p>
<p>Minimization is disabled by default for <code class="literal">ewma</code> and <code class="literal">holt_linear</code>, while it is enabled by default for <code class="literal">holt_winters</code>.
Minimization is most useful with Holt-Winters, since it helps improve the accuracy of the predictions.  EWMA and
Holt-Linear are not great predictors, and mostly used for smoothing data, so minimization is less useful on those
models.</p>
<p>Minimization is enabled/disabled via the <code class="literal">minimize</code> parameter:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_avg":{
                        "buckets_path": "the_sum",
                        "model" : "holt_winters",
                        "window" : 30,
                        "minimize" : true,  <a id="CO273-1"></a><i class="conum" data-value="1"></i>
                        "settings" : {
                            "period" : 7
                        }
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/572.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO273-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>Minimization is enabled with the <code class="literal">minimize</code> parameter</p>
</td>
</tr>
</table>
</div>
<p>When enabled, minimization will find the optimal values for <code class="literal">alpha</code>, <code class="literal">beta</code> and <code class="literal">gamma</code>.  The user should still provide
appropriate values for <code class="literal">window</code>, <code class="literal">period</code> and <code class="literal">type</code>.</p>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>Minimization works by running a stochastic process called <span class="strong strong"><strong>simulated annealing</strong></span>.  This process will usually generate
a good solution, but is not guaranteed to find the global optimum.  It also requires some amount of additional
computational power, since the model needs to be re-run multiple times as the values are tweaked.  The run-time of
minimization is linear to the size of the window being processed: excessively large windows may cause latency.</p>
<p>Finally, minimization fits the model to the last <code class="literal">n</code> values, where <code class="literal">n = window</code>.  This generally produces
better forecasts into the future, since the parameters are tuned around the end of the series.  It can, however, generate
poorer fitting moving averages at the beginning of the series.</p>
</div>
</div>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="search-aggregations-pipeline-percentiles-bucket-aggregation.html">« Percentiles Bucket Aggregation</a>
</span>
<span class="next">
<a href="search-aggregations-pipeline-movfn-aggregation.html">Moving Function Aggregation »</a>
</span>
</div>
</div>

                  <!-- end body -->
                </div>
                <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                  <div id="rtpcontainer" style="display: block;">
                    <div class="mktg-promo">
                      <h3>Most Popular</h3>
                      <ul class="icons">
                        <li class="icon-elasticsearch-white"><a href="https://www.elastic.co/webinars/getting-started-elasticsearch?baymax=default&amp;elektra=docs&amp;storm=top-video">Get Started with Elasticsearch: Video</a></li>
                        <li class="icon-kibana-white"><a href="https://www.elastic.co/webinars/getting-started-kibana?baymax=default&amp;elektra=docs&amp;storm=top-video">Intro to Kibana: Video</a></li>
                        <li class="icon-logstash-white"><a href="https://www.elastic.co/webinars/introduction-elk-stack?baymax=default&amp;elektra=docs&amp;storm=top-video">ELK for Logs &amp; Metrics: Video</a></li>
                      </ul>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </section>

        </div>


<div id="elastic-footer"></div>
<script src="https://www.elastic.co/elastic-footer.js"></script>
<!-- Footer Section end-->

      </section>
    </div>

<script src="/guide/static/jquery.js"></script>
<script type="text/javascript" src="/guide/static/docs.js"></script>
<script type="text/javascript">
  window.initial_state = {}</script>
  </body>
</html>
